

import bpy
from bpy.types import Operator
import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类


E_链表数据类型枚举 = [
	("TYPE_int", "int", "", 0),
	("TYPE_float", "float", "", 1),
	("TYPE_str", "str", "", 2),
]

def f_update_初始化数据改变(self, context):
	outSocket = self.outputs['value']
	if self.m_数据类型 == 'TYPE_int':
		outSocket.f_set维度(1, T='int', 默认值=0)
	elif self.m_数据类型 == 'TYPE_float':
		outSocket.f_set维度(1, T='float', 默认值=0)
	else:
		outSocket.f_set维度(1, T='str', 默认值=0)
		
	self.f_pushUpdate()
	

def f_代码头置入(self, context):
	代码头 = '# 参数:维度 = (x,y, vec3) - 参数:data 返回数据 - 实例数据:[[0.0, 0.0, 0.0]]'
	self.m_Code.lines[0].body = 代码头




def f_代码头置入_vector_i(self, context):
	代码头 = '# 参数:初始数量 = int - 参数:data 返回数据 - 实例数据:[0]'
	self.m_Code.lines[0].body = 代码头
class C_SN_List栈(基类.C_SN_基类):
	bl_dname = 'bl_node_List栈'
	bl_label = 'list 栈数据'
	
	m_Code = bpy.props.PointerProperty(type=bpy.types.Text, update=f_代码头置入_vector_i)
	m_初始化数据 = bpy.props.StringProperty( update=f_update_初始化数据改变 )
	def init(self, context):
		super(C_SN_List栈, self).f_init(context)
		self.inputs.new('C_NodeSocket_i', name='初始数量')
		self.outputs.new('C_插座_List_i', name='value')
		#outSocket.f_set维度(1, T='i', 默认值=0)

	def draw_buttons(self, context, layout):
		if self.m_Code == None :
			layout.prop(self, 'm_初始化数据')
		layout.prop(self, 'm_Code')

	def f_update(self, 是否向下传递=False, input插座=None):
		print('C_SN_List栈 = ', self.m_Code)
		if self.m_Code == None :
			data = self.m_初始化数据.split('#')
			#print('data = ', len(data), data)
			转换Data = []
			for i in data:
				if i == '' : continue
				转换Data.append(int(i))
			print('转换Data = ', 转换Data)
			self.outputs['value'].f_setData(转换Data)
		else:
			全局变量 = {'初始数量':self.inputs['初始数量'].f_getData(), 'data':[0]}
			基类.f_执行代码(self, 全局变量)
			self.outputs['value'].f_setData(全局变量['data'])
		
		super(C_SN_List栈, self).f_update(是否向下传递, input插座)


class C_NODE_MENU_List栈(bpy.types.Operator):
	bl_idname = 'node.global_node_list_mem_stack'
	bl_label = 'list 栈数据'
	bl_options = {'REGISTER', 'UNDO'}

	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_SN_List栈', use_transform=True)
		return {'FINISHED'}








def f_代码头置入_vector_f(self, context):
	代码头 = '# 参数:初始数量 = int - 参数:data 返回数据 - 实例数据:[0.0]'
	self.m_Code.lines[0].body = 代码头
class C_Node_FloatList栈(基类.C_SN_基类):
	bl_dname = 'bl_node_List栈'
	bl_label = 'list float 栈数据'
	
	m_Code = bpy.props.PointerProperty(type=bpy.types.Text, update=f_代码头置入_vector_f)
	m_初始化数据 = bpy.props.StringProperty( update=f_update_初始化数据改变 )
	def init(self, context):
		super(C_Node_FloatList栈, self).f_init(context)
		outSocket = self.inputs.new('C_NodeSocket_i', name='初始数量')
		outSocket = self.outputs.new('C_插座_List_f', name='value')

	def draw_buttons(self, context, layout):
		if self.m_Code == None :
			layout.prop(self, 'm_初始化数据')
		layout.prop(self, 'm_Code')


	def f_update(self, 是否向下传递=False, input插座=None):
		if self.m_Code == None :
			data = self.m_初始化数据.split('#')
			#print('data = ', len(data), data)
			转换Data = []
			for i in data:
				if i == '' : continue
				转换Data.append(float(i))
			#print('转换Data = ', 转换Data)
			self.outputs['value'].f_setData(转换Data)
		else:
			全局变量 = {'初始数量':10, 'data':0}
			全局变量['初始数量'] = self.inputs['初始数量'].f_getData()
			
			代码 = self.m_Code.as_string() + '\n'
			exec(代码, 全局变量)
			self.outputs['value'].f_setData(全局变量['data'])

		super(C_Node_FloatList栈, self).f_update(是否向下传递, input插座)


class C_NODE_MENU_FloatList栈(bpy.types.Operator):
	bl_idname = 'node.global_node_float_list_mem_stack'
	bl_label = 'float list 栈数据'
	bl_options = {'REGISTER', 'UNDO'}

	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_Node_FloatList栈', use_transform=True)
		return {'FINISHED'}




def f_代码头置入_vector_vec3(self, context):
	代码头 = '# 参数:初始数量 = (int) - 参数:data 返回数据 - 实例数据:[vec3]'
	self.m_Code.lines[0].body = 代码头

class C_Node_FloatList栈_vec3(基类.C_SN_基类):
	bl_dname = 'bl_node_List栈'
	bl_label = 'list vec3 栈数据'
	
	m_Code = bpy.props.PointerProperty(type=bpy.types.Text, update=f_代码头置入_vector_vec3)
	m_初始化数据 = bpy.props.StringProperty( update=f_update_初始化数据改变 )
	def init(self, context):
		super(C_Node_FloatList栈_vec3, self).f_init(context)
		outSocket = self.inputs.new('C_NodeSocket_i', name='初始数量')
		outSocket = self.outputs.new('C_Socket1D_Vec3', name='value')

	def draw_buttons(self, context, layout):
		if self.m_Code == None :
			layout.prop(self, 'm_初始化数据')
		layout.prop(self, 'm_Code')


	def f_update(self, 是否向下传递=False, input插座=None):
		if self.m_Code == None :
			data = self.m_初始化数据.split('#')
			#print('data = ', len(data), data)
			转换Data = []
			for i in data:
				if i == '' : continue
				转换Data.append(float(i))
			#print('转换Data = ', 转换Data)
			self.outputs['value'].f_setData(转换Data)
		else:
			全局变量 = {'初始数量':10, 'data':[[0,0,0]]}
			全局变量['初始数量'] = int(self.inputs['初始数量'].f_getData())
			
			代码 = self.m_Code.as_string() + '\n'
			exec(代码, 全局变量)
			self.outputs['value'].f_setData(全局变量['data'])

		super(C_Node_FloatList栈_vec3, self).f_update(是否向下传递, input插座)


class C_NODE_MENU_FloatList栈_vec3(bpy.types.Operator):
	bl_idname = 'node.global_node_vec_three_list_mem_stack'
	bl_label = 'vec3 list 栈数据'
	bl_options = {'REGISTER', 'UNDO'}

	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_Node_FloatList栈_vec3', use_transform=True)
		return {'FINISHED'}















def f_代码头置入_2D_vec3(self, context):
	代码头 = '# 参数:维度 = (x,y, vec3) - 参数:data 返回数据 - 实例数据:[[0.0, 0.0, 0.0]]'
	self.m_Code.lines[0].body = 代码头
	
class C_Node_Float栈_2D_vec3(基类.C_SN_基类):
	bl_dname = 'bl_node_List栈_2D_vec3'
	bl_label = 'list 2d vec3 栈数据'
	
	m_Code = bpy.props.PointerProperty(type=bpy.types.Text, update=f_代码头置入_2D_vec3)
	m_初始化数据 = bpy.props.StringProperty( update=f_update_初始化数据改变 )
	def init(self, context):
		super(C_Node_Float栈_2D_vec3, self).f_init(context)
		outSocket = self.inputs.new('C_NodeSocket_2i', name='维度')
		outSocket = self.outputs.new('C_Socket2D_Vec3', name='value')

		self.inputs['维度'].f_setData([5,5])

	def draw_buttons(self, context, layout):
		layout.prop(self, 'm_Code')
		if self.m_Code == None :
			layout.prop(self, 'm_初始化数据')


	def f_update(self, 是否向下传递=False, input插座=None):
		if self.m_Code == None :
			data = self.m_初始化数据.split('#')
			
			转换Data = []
			for i in data:
				if i == '' : continue
				转换Data.append(float(i))
			
			self.outputs['value'].f_setData(转换Data)
		else:
			全局变量 = {'维度':self.inputs['维度'].f_getData(), 'data':[[0,0,0]]}
			基类.f_执行代码(self, 全局变量)
			
			self.outputs['value'].f_setData(全局变量['data'])

		super(C_Node_Float栈_2D_vec3, self).f_update(是否向下传递, input插座)


class C_NODE_MENU_Float栈_2D_vec3(bpy.types.Operator):
	bl_idname = 'node.global_node_vec_three_tow_d_list_mem_stack'
	bl_label = 'vec3 2D 栈数据'
	bl_options = {'REGISTER', 'UNDO'}

	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_Node_Float栈_2D_vec3', use_transform=True)
		return {'FINISHED'}















'''

class C_Node_Float栈_2D_vec3_任意维度(基类.C_SN_基类):
	bl_dname = 'bl_node_List栈_任意维度'
	bl_label = 'list 2d vec3 任意维度 栈数据'
	
	m_Code = bpy.props.PointerProperty(type=bpy.types.Text, update=f_代码头置入)
	m_初始化数据 = bpy.props.StringProperty( update=f_update_初始化数据改变 )
	def init(self, context):
		super(C_Node_Float栈_2D_vec3_任意维度, self).f_init(context)
		outSocket = self.inputs.new('C_NodeSocket_2i', name='维度')
		outSocket = self.outputs.new('C_Socket2D_Vec3', name='value')

		self.inputs['维度'].f_setData([5,5])

	def draw_buttons(self, context, layout):
		layout.prop(self, 'm_Code')
		if self.m_Code == None :
			layout.prop(self, 'm_初始化数据')


	def f_update(self, 是否向下传递=False, input插座=None):
		if self.m_Code == None :
			data = self.m_初始化数据.split('#')
			
			转换Data = []
			for i in data:
				if i == '' : continue
				转换Data.append(float(i))
			
			self.outputs['value'].f_setData(转换Data)
		else:
			全局变量 = {'维度':self.inputs['维度'].f_getData(), 'data':[[0,0,0]]}
			基类.f_执行代码(self, 全局变量)
			
			self.outputs['value'].f_setData(全局变量['data'])

		super(C_Node_Float栈_2D_vec3, self).f_update(是否向下传递, input插座)


class C_NODE_MENU_Float栈_2D_vec3_任意维度(bpy.types.Operator):
	bl_idname = 'node.global_node_vec_three_tow_d__arbdim__list_mem_stack'
	bl_label = 'vec3 2D 栈数据'
	bl_options = {'REGISTER', 'UNDO'}

	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_Node_Float栈_2D_vec3', use_transform=True)
		return {'FINISHED'}
'''









classes = (
	C_SN_List栈,
	C_NODE_MENU_List栈,
	
	C_Node_FloatList栈,
	C_NODE_MENU_FloatList栈,

	C_Node_FloatList栈_vec3,
	C_NODE_MENU_FloatList栈_vec3,

	C_Node_Float栈_2D_vec3,
	C_NODE_MENU_Float栈_2D_vec3,

	#C_Node_Float栈_2D_vec3_任意维度,
	#C_NODE_MENU_Float栈_2D_vec3_任意维度,
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		

def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)



